package com.example.basic.base.impl;

import com.example.basic.base.BaseService;
import com.example.basic.base.Context;
import com.example.basic.base.IdEntity;
import com.example.basic.base.event.PreCreateEventEntity;
import com.example.basic.base.event.PreDeleteEventEntity;
import com.example.basic.base.event.PreUpdateEventEntity;
import com.example.basic.utils.DateUtils;
import com.google.common.collect.Maps;
import org.apache.logging.log4j.util.Strings;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Map;

/**
 * @see BaseService
 */
@Transactional
public abstract class BaseServiceImpl implements BaseService {
    //    @Autowired
    //    protected IdWorker idWorker;
    @Autowired
    protected Context context;

    @Resource
    private HttpServletRequest request;
    // ================================================================================================
    // 获取多语言文本
    // ================================================================================================

    /**
     * @see BaseService#getMessage(String code)
     */
    @Override
    public String getMessage(String code) {
        return context.getMessage(code);
    }

    /**
     * @see BaseService#getMessage(String code, Object[] args)
     */
    @Override
    public String getMessage(String code, Object[] args) {
        return context.getMessage(code, args);
    }

    /**
     * @see BaseService#getMessage(String code, Object[] args, String defaultMessage)
     */
    @Override
    public String getMessage(String code, Object[] args, String defaultMessage) {
        return context.getMessage(code, args, defaultMessage);
    }

    // ================================================================================================
    // 其他通用的方法
    // ================================================================================================

    /**
     * @see BaseService#generateNextId()
     */
    @Override
    public Long generateNextId() {
        return 1L;
//        return idWorker.nextId();
    }

    @Override
    public Map<Boolean, String> boolMap() {
        Map<Boolean, String> map = Maps.newHashMap();
        map.put(true, getMessage("label.yes"));
        map.put(false, getMessage("label.no"));
        return map;
    }

    // ================================================================================================
    // 日期相关基础方法
    // ================================================================================================

    @Override
    public Timestamp getTimestamp() {
        return new Timestamp(new DateTime().getMillis());
    }

    @Override
    public DateTime getDatetime() {
        return new DateTime();
    }

    @Override
    public Date getDate() {
        return new DateTime().toDate();
    }

    @Override
    public Date getMaxDate() {
        return DateUtils.MAX_DATE;
    }

    @Override
    public Date getMinDate() {
        return DateUtils.MIN_DATE;
    }

    @Override
    public Timestamp getMaxTimestamp() {
        return DateUtils.MAX_TIMESTAMP;
    }

    @Override
    public Timestamp getMinTimestamp() {
        return DateUtils.MIN_TIMESTAMP;
    }

    // ================================================================================================
    // 实体相关预处理方法
    // ================================================================================================

    /**
     * 创建时间和创建入的预处理
     *
     * @param entity 实体
     */
    protected <E extends PreCreateEventEntity> void preCreate(E entity) {
        entity.setCreateAt(getTimestamp());
        entity.setCreateBy((String) request.getAttribute("userCode"));
    }

    /**
     * 更新时间和更新入的预处理
     *
     * @param entity 实体
     */
    protected <E extends PreUpdateEventEntity> void preUpdate(E entity) {
        entity.setUpdateAt(getTimestamp());
        entity.setUpdateBy((String) request.getAttribute("userCode"));
    }

    /**
     * 删除时间和删除入的预处理
     *
     * @param entity 实体
     */
    protected <E extends PreDeleteEventEntity> void preDelete(E entity) {
        entity.setDeleteAt(getTimestamp());
        entity.setDeleteBy((String) request.getAttribute("userCode"));
    }

    // setter and getter
//    public IdWorker getIdWorker() {
//        return idWorker;
//    }

//    public void setIdWorker(IdWorker idWorker) {
//        this.idWorker = idWorker;
//    }

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    @Override
    public boolean isValidId(String id) {
        return id != null && Strings.isNotEmpty(id);
    }

    @Override
    public boolean isValidEntityId(IdEntity idEntity) {
        return idEntity != null && isValidId(idEntity.getId());
    }
}
